{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "## torch训练分类器学习笔记\n",
    "### 数据加载\n",
    "可以使用专门的python包将数据加载成numpy数组，在将数组转换为torch.Tensor，python包包括：\n",
    "1. 对于图像：Pillow、OpenCV\n",
    "2. 对于音频：scipy、librosa\n",
    "3. 对于文本：基于原始python或Cython、NLTK和Spacy\n",
    "4. 针对视觉有专门的包：torchvision，具有用于ImageNet、CIFAR10、MNIST 等常见数据集的数据加载器和用于图像的数据转换器，torchvision.datasets和torch.utils.data.DataLoader\n",
    "### 训练图像分类器\n",
    "1. 加载并归一化训练数据集和测试数据集\n",
    "2. 定义卷积神经网络\n",
    "3. 定义损失函数\n",
    "4. 在训练数据集上训练网络\n",
    "5. 在测试数据集上测试网络"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "#### 加载并归一化CIFAR10"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "import torchvision.transforms as transform\n",
    "transform = transform.Compose(\n",
    "    [transform.ToTensor(),\n",
    "     transform.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]\n",
    ")\n",
    "batch_size = 4\n",
    "trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)  # 加载训练数据集\n",
    "train_loader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=2)\n",
    "testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)  # 加载测试数据集\n",
    "test_loader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=2)\n",
    "classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "#### 显示部分图片和label"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "bird  plane ship  cat  \n"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "# functions to show an image\n",
    "\n",
    "\n",
    "def imshow(img):\n",
    "    img = img / 2 + 0.5     # unnormalize\n",
    "    npimg = img.numpy()\n",
    "    plt.imshow(np.transpose(npimg, (1, 2, 0)))\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "# get some random training images\n",
    "dataiter = iter(train_loader)\n",
    "images, labels = next(dataiter)\n",
    "\n",
    "# show images\n",
    "imshow(torchvision.utils.make_grid(images))\n",
    "# print labels\n",
    "print(' '.join(f'{classes[labels[j]]:5s}' for j in range(batch_size)))"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "#### 定义卷积神经网络"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "outputs": [
    {
     "data": {
      "text/plain": "Net(\n  (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\n  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\n  (fc1): Linear(in_features=400, out_features=120, bias=True)\n  (fc2): Linear(in_features=120, out_features=84, bias=True)\n  (fc3): Linear(in_features=84, out_features=10, bias=True)\n)"
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "\n",
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "        self.conv1 = nn.Conv2d(3, 6, 5)\n",
    "        self.pool = nn.MaxPool2d(2, 2)\n",
    "        self.conv2 = nn.Conv2d(6, 16, 5)\n",
    "        self.fc1 = nn.Linear(16 * 5 * 5, 120)\n",
    "        self.fc2 = nn.Linear(120, 84)\n",
    "        self.fc3 = nn.Linear(84, 10)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.pool(F.relu(self.conv1(x)))\n",
    "        x = self.pool(F.relu(self.conv2(x)))\n",
    "        x = torch.flatten(x, 1) # flatten all dimensions except batch\n",
    "        x = F.relu(self.fc1(x))\n",
    "        x = F.relu(self.fc2(x))\n",
    "        x = self.fc3(x)\n",
    "        return x\n",
    "\n",
    "\n",
    "net = Net()\n",
    "net"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "#### 定义一个损失函数和优化器"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "outputs": [
    {
     "data": {
      "text/plain": "SGD (\nParameter Group 0\n    dampening: 0\n    differentiable: False\n    foreach: None\n    lr: 0.001\n    maximize: False\n    momentum: 0.9\n    nesterov: False\n    weight_decay: 0\n)"
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch.optim as optim\n",
    "\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)\n",
    "optimizer"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "#### 训练网络"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1,  2000] loss: 2.239\n",
      "[1,  4000] loss: 1.977\n",
      "[1,  6000] loss: 1.766\n",
      "[1,  8000] loss: 1.637\n",
      "[1, 10000] loss: 1.561\n",
      "[1, 12000] loss: 1.515\n",
      "[2,  2000] loss: 1.437\n",
      "[2,  4000] loss: 1.424\n",
      "[2,  6000] loss: 1.389\n",
      "[2,  8000] loss: 1.340\n",
      "[2, 10000] loss: 1.371\n",
      "[2, 12000] loss: 1.306\n",
      "Finished Training\n"
     ]
    }
   ],
   "source": [
    "for epoch in range(2):  # loop over the dataset multiple times\n",
    "\n",
    "    running_loss = 0.0\n",
    "    for i, data in enumerate(train_loader):\n",
    "        # get the inputs; data is a list of [inputs, labels]\n",
    "        inputs, labels = data\n",
    "\n",
    "        # zero the parameter gradients\n",
    "        optimizer.zero_grad()\n",
    "\n",
    "        # forward + backward + optimize\n",
    "        outputs = net(inputs)\n",
    "        loss = criterion(outputs, labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "        # print statistics\n",
    "        running_loss += loss.item()\n",
    "        if i % 2000 == 1999:    # print every 2000 mini-batches\n",
    "            print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')\n",
    "            running_loss = 0.0\n",
    "\n",
    "print('Finished Training')"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "#### 保存模型"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "outputs": [],
   "source": [
    "path = './cifar_net.pth'\n",
    "torch.save(net.state_dict(), path)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "#### 在测试数据上测试网络"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAACwCAYAAACviAzDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABOiElEQVR4nO29eZBd1XXvv85w57HnQd2SWkhCAolJEnpgHsgDijHBochgm9jgpH5VJlgOsqrCYFJlxYUlnv8gJFWBxC4HeD+HwskPPMRxKITBAp6MAQ0gJDSh1tytVg+3b/cdz7B/f/C4e6111ZduaF0NvT5Vqjq79+lz9tl7n91H+7sGQymlQBAEQRAEoU6YZ7sBgiAIgiDMLOTjQxAEQRCEuiIfH4IgCIIg1BX5+BAEQRAEoa7Ix4cgCIIgCHVFPj4EQRAEQagr8vEhCIIgCEJdkY8PQRAEQRDqinx8CIIgCIJQV+TjQxAEQRCEunLGPj4ee+wx6OnpgXA4DMuWLYNXX331TN1KEARBEITzCPtMXPSnP/0prF27Fh577DH41Kc+Bf/yL/8CN910E+zevRtmz55d83d934cTJ05AIpEAwzDORPMEQRAEQZhmlFIwNjYGnZ2dYJq19zaMM5FYbuXKlXDVVVfB448/XvnZ4sWL4dZbb4WNGzfW/N1jx45Bd3f3dDdJEARBEIQ6cPToUejq6qp5zrTvfJTLZdi6dSvcf//95OerV6+GLVu2VJ1fKpWgVCpVyh9+C33729+GUCg03c0TBEEQBOEMUCqV4O///u8hkUh85LnT/vExODgInudBW1sb+XlbWxv09/dXnb9x40b4u7/7u6qfh0Ih+fgQBEEQhPOMyZhMnDGDU35zpdRpG/TAAw/A6Oho5d/Ro0fPVJMEQRAEQTgHmPadj+bmZrAsq2qXY2BgoGo3BEB2OARBEARhpjHtOx/BYBCWLVsGmzZtIj/ftGkTXHvttdN9O0EQBEEQzjPOiKvtunXr4Gtf+xosX74crrnmGvjhD38IR44cgbvuuusTX3vO6C9I2VB+5TgYoI9jMFefclkbtrqeQ+qCwWDl2PN9Uqd86hBkmF7l2LRo+5QT0+eBR+oCwWLl2ALeVnoPz3crx45L2+P7SL4y6HVcj0pbJXQuF7181HdcEiuXaf94nr4P7nMAABM9Z5n1Xc4lRciX9bmxS+6EiVizZg0puy69UL3dsKftfty3TNWoYv81UOgMs7pSY9AxMFhZAZ4T9DpTcX6r1Sf4Otjr7XTMuQHNA4+O89ApvYNaKhZJ3byL5pNyOpWsHAcs+lzBgH5Rg7yOrRO2odvuuQVSF48F0D3o89uobLGFYWRkmJSxQV4gECB1tqF/1zDpPVy/TMq1vBlNQ1fmc3l6D5uuG+FwuHJcLtN7uGjdjIQjpM5gz/kPj/yvCdvT1d1aOY43LyR1EStIyslEvHI8VqLraC47VDk2TbY2srfIRh0UsekOe9hCfcDW36rFElV7vjdhnc/qcHt4n5us72q9TwaakwZ/Zt6eGtfEKkPQZIqDomUjqNuXH3qP1L38+rsT3nOynJGPjy996UswNDQE3/ve96Cvrw+WLFkCv/71r2HOnDln4naCIAiCIJxHnJGPDwCAu+++G+6+++4zdXlBEARBEM5TJLeLIAiCIAh15YztfJwpylUaNdJkmb1BCGKkbILWsGyb6mREO+XyX4Des4Q0Udenup2NtHiL2YPY6DKGT20qwC2RIraj8Nk9yobWZz2L6nRlfq6nb2owbdBAdiXhANe9adm0kQ7usLYb+jqK2bkoJp5a1uS+dy3eeWeZM2VjgsekytqC6f0+7kvFjY2QHQfTrw2g7wW905m3+fgo4lE9h01Fl6RSTtf5ZWq3EA7S+8ci+ndt1jT8PoVs+syRIJvrqL9KHp3PIVu/e0H2zuDhsm06Ptjm5INzkYbPxieE7M/465LL03cPV2O7NQAAhdY7k82lALM/wHYnTomuRXgtiHDPxCm8F77SfedaDaTOCdC12rO0zYcZYDYfhfHKsfJypI6Zz0BJ6d91mK1EEc0DZg4CZYfaF5loPSrkqR0QXqu4/Q62nTNNOnaK2++gweZj6bponWCvs2Gwv0FobBsaaD+HItrWyGTrhM/XjZB+Fm88DtON7HwIgiAIglBX5ONDEARBEIS6ct7JLspnvpsK5YVhbnqGR7ejfEdvc1kR+t2Ftz75jj93ZQqirTVX0W0239G/zH8Pb50ZbFuau04ayPVMWWFSV/D0HmH/EN3Ky5XpdcfHdb2laHsSYeR+yNwxk1HqUhcJ6b71TbZdiOQALpewXVBw/Mltx/Nt+zOQ/3BKfJL7E3mCXwfvobIdbMWlFfR/hZJD57qNt3s9OpaWUavtXJKZHqbSXzaS7Uwm2wUt3b6AySQQk/ZBGJ/L3GBLBS3ZWEyqDNt0rjslveVuAr2HcnWdYm7uHpKzggF6TZOPAXoXubuzhyTZfJ5KTUOnTpFyW7PeVuduuVZQt89ioh6fE1hBstl1SmhdtVm/Omwe1sJU+lyPrUUeW388Q/dzOEH7uWmODlZpjo6Qunh+nJTLRf33wYvTddRPpSvHCSbh4bYCAMnQWi7R9Q+HZgiHmbsqdqVn7wSXLXGZZ4R1UT/7/JVl60bQ1mtBJMJcowHLffRvhw/cTRjbCUy/7Cw7H4IgCIIg1BX5+BAEQRAEoa7Ix4cgCIIgCHXlvLP5sD3qBgYWCjnN3FdDFtMjsf8d09SwmxP3eXS5nQLSRANBqqm1z724cpzNDJK6wSGt3wZs6kplAnOZdfXQFFSU1L13WOu+KtRE6hyLuqyVkc45PkpDPB8/qfXSeJjp130ZUp7drtvblOCaOQ69TvucSalVWu9E1NJDzxR1sSup6g99T+XTSpeJuw6yGdp/8CCpa2vXoat9Fh67pZG624WRC51/hp55KuMVRLYcvkvbbiFdOsBcJQNMszY9/X4FA0x7t/Q9AsxmKWDSue8but706XrjFpHLLnvXiqjfo8xmymJ2FES4Z2OQQ2Hkt27dRuqcArUBaUiu0O0J0TUNm2fwlAjA7NFMbAvA3lEf2dkp9ntVNng1cAG5eQJd/3yLtq+E7J0sZvsUQ36xySizudv2JimXB7UNSMeSi0mdcUqvjSWDjmWc2baMFbRLb5j9gQghuz+zibqkmsjVlrtNl6LUBsV29HUth90/pudWaHSU/l73JaScT6cqx75LXYY9NA/DPh2DKjtED7l8e9O/TyE7H4IgCIIg1BX5+BAEQRAEoa7Ix4cgCIIgCHXlvLP54KK5Yaf1MdOZXZ76HcUFKDNtOYh8/z2P65rMTgHdh4dYXvm5GyvHW7f8jtSdQDYgOZd2vetRrfDwsYHKce+x46Qu1NBROe5q66FtDSVIuYz00UC8hd6zqPXQoYETpC7aQG1Jjo3r1OZFZovQltCaZ5SFkfYcqlHjCL61Ikx8VJyPetiATOV+k7cXYbEYAlpX9RStK4xTe4PMqNadTw5S+51IQmvWTQk6B0yDx7RBIfeNKcT54HY4k//NmgSRLZZi9wjgCcPsvSzgcX10fQDoPHSQ9u0x2xorybVvZEvCQmD7Luovj9qVjGczleM40/NNNj9wmno7QNeCDIrtMZyl70+EhYYvoy4oO3Qs7SCyJ2JroedRexkXrYflMu3nILLpUuzd973J2XB9AEoBwONoKNoez0V9y4wlDGRjUTToXA/41HbDaNa2UPkxOpZO777KsWtQGx2fDh/kcIh31gdBR7e1fJTF5kFjwsPoF1ncEauo623aVCi162cu9NN3P2HQdd1INVeOPW43ht6nAE/fwOaIhWyxbHP6bcNk50MQBEEQhLoiHx+CIAiCINSV8052KZl0m200r7fZPOZW1BCnW3tJ5G5ns21Q7OJXFQmZuZNht9x8nob3felXv6gcn8zQ7cuT4/r3Dh+nv3f4xFFStsJahvGsJKmLJfU2WyBK5Ro7TLcPQ2jLPWzSLcnBss7O2NE1m9QVCzRb5MGDWnYZztB+tmbpNsxtoe0JsFDfBgrVzJymCTwLJ3dD/bgofpkau4kk3PFHyC4e2lL22VYnzuSLs1wCAJwaylaOsznar4USy+aZ1z1mhqj7da6g5288yrb42TNikeGTqFfTJX2FDP2cnkHfNexei8OeA5wm9LmPwqKz0Oe2OXGIcMtg2UaJvMP6Ernze8zVd3xMj+UR3lYml2AZpDtJxxKHUH/7nXdI3WWXXkrKPnqWkkf36sNInvCZfFTIM9nZ1u1xmVRq2bp9jkv7vFSi59YCy9k+WxcU/38wCm9QZhKNh9qaGmNj19JGypHWOZVjV1EXVUDh51VzO6kqBOi42/1DusBSSOTQmqvaqFwd8PVzFZl8H0uwsAhjui9LbI7aEeT2ytYJu6mVlI2A7h9PUWkwgS5rMRnINajbsmHi8vRnGZedD0EQBEEQ6op8fAiCIAiCUFfk40MQBEEQhLpy3tl8nCpQ7WnYSVeON/+f35K6SxZSTe3Tl2oXpAaL2XwgPdJkmp5pUi3MQ25hzIsReg/rsNfDBaq3qWhj5diKM3fIxiwpR9LpynG5SDW+MnKPTDbQZ0zGaXmgX9tqZEeYixbSPMMs9fKRERoaPpDUWupA32FSF+8fqxy3J+l1Ikx7d1kI/InI5Qv0ByzEvY3GSLE6y7ZOewwAYDCDHmwDYvoTf4ub3LGU2TuMI42fu91GkKtikaUg70M2HwMjdA747J4OMt7Ij9HU4QPI9fbY8T5Sd8mCeaR80dyuyrHFQmmTtivWH9zEg4TvplVV/VUDC9lq+dw1G9liFUZp/wCzN1AmCmUdofMuiOZdkM8Jh9o3efi6HjuXuAVTu4lcTtsUnDxJ2xZLUlsohdI7KJu2tTyufzfMwsSfymRIedu72iYkFqJtnT9Pj7vNbFdK+TFSjti63i/Rd89D7sUeXQoBimxMaoGmhOfzEO5VE0ify9x5A8hGKHRgP23O1ldJ2V2B7HdMth6jtBVBZjtSBDp+cZRuwgrR6/gx3R5DUbdtz9HXTTSlSV3g+BApw7h+pwNt9O8DHNXn2mwuFU9RuyAL2QH6C2no9WJQt89kbvZBl9mZoPWGR+efDmTnQxAEQRCEuiIfH4IgCIIg1JXzTnaxU3QLOT+kv5+cII30Npyn25D5so4olwyyyIXYnYtv41vUFa5Y1tLCKeYvOjimt+Ciaep21dCi3VlzPt2ubAaWBRO5b5UDtK3FnN4yLY7T68xhrl55JK0MlOl2qoG2dEeHmcsc2xYtoC1BK0j742RWuw33jVKJaE4zk7AmuX2XKdCOjUepnGTaev/XY67QRD1hu//Mgw1MpLsYZo1v8Y+IsNrfp6PQNjY2krpIWG91loq0n6MhXdfe0kzqFGt8Lq/7Nhak27vloh5bi3XyeIllZkVtN5gsRiUjnlkYaHnCQlV31SSMNJuqzJpIdgkxiSjO3K9TyB3QHKVSSgjN5zDf4WcSn4nGKMi26sHT9yxn6XuZiOlzG9gc6D3WT8oHj+ryvgO/IXUjg5nK8XiR3iPv7CJlG1Bk0hx1JV168cLK8Rdv/jypm8XWiVJY908xR/uunNNtTSoWTbNA5ZtaBCyU/ZW5bnLXWx9F1LTZ/5HjI7p97jEamTnJZKqxE7rt5XCK1CnQfw+M/gFSF+tkbrBJJEEAXeMiKBJxMEP7o4jcsd1BKocG2di6WT1+oWEaXsEpILkvQv8GZnppmIZgRMsuiY45pM5CQVWVSd+nEncrR2tD2Z9+3UV2PgRBEARBqCvy8SEIgiAIQl2Z8sfHK6+8Arfccgt0dnaCYRjw85//nNQrpWD9+vXQ2dkJkUgEVq1aBbt27Tr9xQRBEARBmHFM2eYjl8vB5ZdfDn/xF38Bf/zHf1xV/4Mf/AAeeeQRePLJJ2HhwoXw0EMPwY033gh79+6FBMu2+XG4+LKrSfnY63srx/EU1SOvvmYlKUct7SJazlFtDtsQGAFqf+GpBlJOtHZXjne8Q1294mmt28+aQ0MhK6QfB5gdh1+iblflstbYcNsAACykxe16+21SlwzRc6MxrV3GWCj2E/0nK8cut3Nh2mkjCgGdGaFuaSPDutzbR3XnzjYatthmtjYTYSepJu0xewzHRJqxwTJr4nDdzHaFZxfFNgaqRqx1HpadRX8nWUoNZpsAyCYlzUIqOw66p8XGjrljY5sPw6LjYyBjllCEh0lm2Z6Rf3iVCx12Pa7ylqX9g+9SferkjT6OHjpUOXYcOj/Gsvo99Rxqu3L8OM32PILmfo7ZQrU2aRuMeIxlE7XpeJWRO7QdpGuBaWtbmxyz3yniDlN0aT1ygrqu9x7TrtG5MrXfCad0uGwjRgeIvsEAsaAey77D+0jdiRP6/X711f9D6hYz9+uWtLYxKIxnSF0uq9cmZ/HFpG58lKaJqEUoqPtdsbkOPjOeQ/Y8JrPtGUeZxMeXX07qkvYyUs6P6fnjsPAKRgiNUZm580boHMmh0PU81YLj6fYETGrLUkDjwwOUF5gLcX5ctzXG7l9E1wnF6SxoTNC/Tx76ezHO1gJAYeMjDl1TXfZcuNudqRhxTZIpf3zcdNNNcNNNN522TikFjz76KDz44INw2223AQDAU089BW1tbfD000/DN77xjU/WWkEQBEEQznum1eajt7cX+vv7YfXq1ZWfhUIhuOGGG2DLli2n/Z1SqQTZbJb8EwRBEAThwmVaPz76/280zbY2mlmwra2tUsfZuHEjpFKpyr/u7u7TnicIgiAIwoXBGYnzwWMgKKUmTL/9wAMPwLp16yrlbDZb8wMkmqK2AHPmaV/2AovcPbtnPik3I30903uI1Dkozofn0jgWV19/K73uvOWV456l9Dpbt2sbjIY4tXc4MaB1X5uF4Q0FmDaHJLZx5nefGdYabGOc/h5X5jxky9HcQm1iSkjbHhyhthqGRb9LEyhsu22xcNBI+37/6DFS19JANfMFXZOz+/nX//0T2h5mkxJAumY8QfXR+T06nsqKy2h4YZbZnIRm52HRFdbw2fx1WWwRHNchGKLtwfE6gkFqq9HUgMLEM1XYZrE8gjgMd4BpwijVeSZLdfjMKB3bsdFM5djhYexRzI0mFg56wXxqJxDAKcnZxON2JrV4dcvr+vcMFv8B2ewUCvQ9ONRPYzzgW/Jxbkhpm4ZYmL17rKkBFH7dZqG0TVv3e57FabDRPRSzyekfpuHwHRSMJppI0waAHkscah2gOmx9saj7JJmgsSH+x7KllePcKE2tUGQpG44c0XPm/fffJ3UFFGb78BCdL4U8HRM7RNdOTCym1wKXjYHj8Xmox91lMSYMZIcTaaOxO7I52l+nRnW/GyxtRjmPQu6zeDflDL2Oi4yjQkG65mbRGhIOsD+ppi77zP6slOd2Lrp9owW6viCTMojatD8SXfTvpYWrTWbngvcbqrInsJcYvdT+GYivPq0fH+3tH/yx7e/vh46OjsrPBwYGqnZDPiQUCkGIveCCIAiCIFy4TKvs0tPTA+3t7bBp06bKz8rlMmzevBmuvfba6byVIAiCIAjnKVPe+RgfH4cDBw5Uyr29vbBjxw5obGyE2bNnw9q1a2HDhg2wYMECWLBgAWzYsAGi0Sjcfvvt09JgK8TcRU++Vzm+YtkKUhdL0S1Aa0y75nku3WKy0RbywaPUDfe6hh7aiKjOCpqI0e25sK3bF2FhyMN4y51twc3q7CDl3WjrMxikW+xZ5D7W072Q1C1cRGWG4WG9nRpPpkndCRRS2GAuYukGGh56FG3lW0ySiUT1dQtjtD/2H2HZM5HLGPPCJRTydFu4XKDlAJIgxqiqAFFU5y1eROqKim6Vm2jLNMTcKrGU4HFJhskwqUYtaXFXPEBuwjxMsYWlFZYimW90+mhb9BDKngwAcHxAj+XwEHXbLhRYltIS2tYv0P4ooYyuXd10t3J2dxcpx4J4+WD9M4Wstjv262eJRqgsp5AcWnLp3Eo1UAkWu3KWi1QOODWu54/FxicRpu7ProeyVgfomFgoPrVh098L5fR2fNmhhvPDw1T2wP3Fp0vZ03vsYzk6dmWWdqC7Rb+nTQ30hcJZdodHTpG6pjRdU5ZfrsMCHOujLsyjKJP4nmN0bpls3eg5/QY3AADYqC8jCbo2juepLGUj3cxj0oGNsrGa7H32gZYNC7lNs7biklOmcyvCZHAbyScBlhUZu9d6LpNLinq8XPZGByLMtRWF7g+yeRdAMl3AZfIRiwNgoPuEPSaleC4+kd6f/YBmqZj8+zxZpvzx8dZbb8GnP/3pSvlDe40777wTnnzySbj33nuhUCjA3XffDSMjI7By5Up44YUXpiXGhyAIgiAI5z9T/vhYtWpVlWEexjAMWL9+Paxfv/6TtEsQBEEQhAsUye0iCIIgCEJdOSOutmeSQJi6kxWRu1upRH1tA8zmIhrD7nZU3w8hbTBuU131yR/+mJRv+dIafY8cjV8SDOnvOdOk+l/PvFmV44Fh6iZYHKcadXurDtM+nKV6ZKmsn3nefOpOfNF8agMyun1b5Tg3RnVV7JbmspTWBWZjkU5rlzZPUTuOVIPWR90yfWbLpH157IS2TWi7DCbkz26joftLzCU0FtHjx13EIsgWwWCGEzyIne/qOROwqQ5uoxDHium8BRYGXPn6niYLBY/dgm2uFwdQenuztl0JDnFc9OlcjyW1rVFDOk3qvDI9N2zpvssMUYOZY8cPVY7nM1d1y6TLBbaD4XYUU4nGnEX2V8qnfRdFKQEiFh2fru6LSNlBz3mKxRUaRHYwbW2tpC7UTG1Zchl9rm/SCZRq0EYNoRANa11E3Zx36TwLx+i65Tn6XbRYeoAgctMNBOl8ccK0fPVV2lZj4ZxO2p6yXlN636d99/7e3aR8zQrtltvdTa9z5B2dlsJhNgS+R9/3WgTRswTDdC75ino8RpAruWvQe4xl9bvnMffZcIraqrXFkNzP3EXxusFtGiz2/3IL2WMRl/ePQKF1ldt8eCzcu1LYloWeG8QWKsw2rMT+zuBqm9mYeaDnGg9/Yfj0uVDGhio7v+lAdj4EQRAEQagr8vEhCIIgCEJdkY8PQRAEQRDqynln82GwVMx5ZCtRZHYBAZYWfmwIaasWtQcJQKZy3JGmOuL+9/aT8oljOs4J5KntxuFjhyrHV7ZfTepmzdF++J0D1CE+d+AwKTeG0pXjRLqZ1L3/fq9ua+csUpdhNg0O0hxPnqI++j7yDzdYyPQ8s/kwTKQVAiWGQq+DT2MvBA0Wp2Dw9Dl+OL7D4mFwDRYdx4M03kIkrMe9UKT9kXeovn7o4CHdVhbnY3bPnMpx71E6zr96/jek7Jh6XoZDNHR0FLWHp8pOJbUtQDpF3dGvvJIaxbQ0axuDi7rouJsoLLnFNGEcawCAxiwotFKNvLMjrY9n0dgzHk8BjsJTYxscgCpZuiYBFLunpZXaG4RRXJjBQRq6P5ejtkc4B3jRoTp4qkW/e7OYLUsiRW03ks3aJmQIxckBAPCQLs6mEgn/nmdxK8oOCx8OKLR3kL574ZCezwEWx6I1SW1HWhp0OcxiQ7Qg+5QkCwk+dOQIKR9+/1DluL2RrjejJ3X4+0AjTdFQtib/J8RGa4hl0OcKs3U9M6DjogyP95G6U316HjQk6Hqz5JKlpBxAtn0lZhvmIHsVk6Vv4OuNiWL3c5subDvBPUE9EpOEB9bghlH4HizdBrkHXRttdh28FvDrBLA9EV/IWXNMZE/jTSFdwmSRnQ9BEARBEOqKfHwIgiAIglBXzjvZhW9VWWgLqqOZbsHh7W4AgJfe0SHLG1y6dbWgEW+bM9c3m0oQpwYO6eaU6Lbs7It0KHaL3T+a1Nu7zW3UvW+IZb0cRe61bLcbWlv1trDNpKUic3Uto+3nAtt+d9GFXXaTYolui7qu/k5taqauioah+y5o0L4KMTc5T02c9RLz8/98gZR9h7qLmiiMcpy5VCfQ1vTcBbSfW5poeP6mDp0Bt5E9VzimJZLMe1QW2/neUVIuoO1W5k0LNtrPTMao7DJ/tpZ2rrn6Ktq2GJVhYmiLm+/gltG4ux4d5zzKYgsA4KDw4ZEobU86rbf8T/afJHWDgzREeARlKW1rp30XjU4+WWQDkhUtto1fKun5ZLD/Kw0PZUg5m0Xuq+y9sFDG0MPH6XMls1QSSaXSqD20f0rItd9gczuEM5rG6JyMKJ4dFw0g20aPRfTvBhSd911NVGKMIvfVXDZD6lwk/RhsS72HSU/v7dEh7hcuvJiejOSJEydo6PUwS8MAwMsaLE/YzEXWZ1LGGEohceoUlWozI7oN+955g9Tteft3pDx/vk43MXf+YlLX0IykbyYreCxrNSjdPi5AWCRsO63FrvXctdVnbrA+WYOZ6y+6DhdrqrJx1/BzJ66//PfYuXh+878r04HsfAiCIAiCUFfk40MQBEEQhLoiHx+CIAiCINSV887mg6czTsW17pxOMHc/pttlldZLB0eoptac0F0RY25pnkl110MnDlWO2xpSpG4O0hiL9Nfgja3vVY6P91FbkUScuvsFUHjhXQeoWxz+ZvTZ92OJaXPjKCV3upHqsS4yHOg7OUDqYgn6XDYKBRyNUj07GER6tkPdeb0cfc621sllN35z+7ukHAlQ99VSSbvQBoO0D1b+jxWV48PHqW3GEPXagyWX6vDUQeYGm0d2LwFmv3PVVdQNtohSnQcD9LVaME/bAV26mOrpnc3pynEySuevX6R2N0f7dVr0gRHar32Dui7HQvVnMhlSLju6rQHm5hkM6T7wXOaayNxXo2k9lkvgUlKXSk0+izW2z8gX6DNbyFjBYuHvPY+Ou21rex5f0bpgSLenuZm6EMfjtN/DaB6kQizkPpqHPPy9QqHHXZe+/KkktTUyUSh936PPbCP3Wr9EbcFSIXZPV4+lx2x9yij1eoHNpSh7vw/36/d29/vU3qpU0muIU6RzQDHbjclisXU8HKb9vOjiRZXj+YupW3l+TNuA7Nq2jdRtf+t1Un71FW2r9d5uuqYsXHxF5XjBxdQeJN2QJmXsDm1VPTMeE79GHXuffGpn57M5Q+o8fR2PGXz57LqTdYo1uM2HQZ/LRC75bpVb8CdHdj4EQRAEQagr8vEhCIIgCEJdOe9kF549s71VRy602beUz1xLO7r09vdbSDoBAMgYOnKfsui2daqZbo+lklqWCYTp9vJcJLvEU9T194l//X8rx3nWtmyBujHmUbREtosP7SiLbHGYuoDmQrytWmras5dGaj15Um/VZ1nG23Sa3jQZ09vGFnP/C6DsmVaeuuK1xNj2c1iPH4/5iDl1lEV8baSyVFeXdu285LIFtD1oa3rXDuqK18a2d+Moo+jAINVkYkm9Nd2UpL/3xc9fT8omCumZStEt7eYmPQ+Gh6ks1XtYj8lohkZjzY7SCJ5jyP06k6NzdDirs9O6zC05EKAyYjCkyybLVplK6r5Ls+y4DUwyCyH5LRihUtw4i5BbiyYUfZRHto1HdFt9j0UwNumYtKLoqIbNnhlFugwyKSXMMqxatu4TLq0YONUnq8ORZfM5+j7xLKXYLVexbMb5UT1Hjh+i7+wwC0uZjujrtDWlSV04rMeEu0oqm8qIdlS7p586RqP5dnfotTFRps+RLU3eBRO7lpom3eJXLHswjihqsein6abuyvF1q6iL9/z5PaT82ubfVo57e+nalNuu1+Asc1NeetnlpNzdre9pM3dwz9VriMfdZ5H0r7gzK5M9DCQxsqkFholdfdnfOR6ZFJ1bFXEVt6/K1ZZfd2KpZzqQnQ9BEARBEOqKfHwIgiAIglBX5ONDEARBEIS6ct7ZfBC3TgBINmi92PXo44SYrrmwR4fSfmsr1a+zAR1u2Deo1t42i2qOu9/TIXyvveEvSN3vtmhXr1yOZZgtD1aOB/qpCyj/Dhx3dNkGquE3mNo+ZFaE3mP0FNWIXUvbSrS1UrsJD4VNLjCNvljIk3IOuUO6PtWznaLOMtkaoLp8Z5zaApRcXV/L5uP4vl2knGWuires/qvK8ec//1lS9+JL2lWwNU3HuTXKMuCiMNdhg+q1bSmtgydSNJtomIUld5Gey20KXBTSuH8v1Z2PDOhQ32WHarB2mLY1kdCu0q1h2q9OeWI3vQBzHbeQnYfFbD4SCd1fySTtO8uiuu94Ts+RkycHSV2xSOdPLaLI3sBhLqERFI4+naT6vs9cge2gdoONxGnbsRuhyTR7XzEXQ/wusv+eYQ9exdwqXTS3XY8+f3aI9g9uQYDZfIyPalusvhPU/qKtkc7DdEyHps8zewwf2a64bKnHbsEAALO6tE3DxQvmkborLtHlfQfpurV953swWQxk52EatD2mTW3gAsi132MuoAbqd5O54C9YSF3gfZQWoq/vWVI3Mqj7dn9plNSdPL6XlC9aoF1/F19K79Hapl23bfY3x3V0+xyXp5qg9nl4jhq1ssgy+yGjhnOt4nVkDPhlmfEIMjypyrI7DcjOhyAIgiAIdUU+PgRBEARBqCvy8SEIgiAIQl0572w+YnGqgzc0a83TZTpi0aR6YDiu9dJ0msZiOHJUh+y9bgUNFV0cpxpbNKFDkfcdP0bqDuzbp9vDwiZj1/ZclmqMiSYa8nl0VGvGqTi1Ibh44dLK8Ztv7yF1297rJeXrPv2FynGApZ4/eEDbh2SyVKPmYduLBW3nMaeN6ukRlD68kWnSyqY6p1ueXJjeYp7GsVh6+VJS/sxnP1M5bkrTeCqfWqljcJhMT0+wVOtJNJ+sIAulHdSxIXgsBh/o2I6O6NgMSab7+qAHft7FS0hda9fCyvHwCLXfSbA4Gw7S6Q0WPjyAJhdP1V0sUnuecRSDQrEQz+MoDfvRPhr3hNsBOXl9Xc+j14nGaB/UIofsjRIRbmei3+mBUzRGSnY0Q8q+r/tkPksLn27U64QV4DYEtIxtdMplaouQRzFtiiXaH25Zj5/hURscVaLXwSkc0mma9iAS1HE1bIPOuzSzoUoldLnM7pFH/VEu0faYBn0vG5BNUzRE59YxFHPHYq/vpRfTGDunUJh/jolsCHi8Jos9ZxBV+ywmCA5swWNTlJntU1f33Mrx3LlzSd2bJ/X8dpn90KmBDC0j+5D33nuH1PX0aHvBiy6i/dHWpkPDJ1hIezCoHUWxjOKFsHUygOyZeOwOHl4dVyuDh3snZ9LmsFgeuGRNOmj75JGdD0EQBEEQ6sqUPj42btwIK1asgEQiAa2trXDrrbfC3r3UKlgpBevXr4fOzk6IRCKwatUq2LVr1wRXFARBEARhpjEl2WXz5s3wzW9+E1asWAGu68KDDz4Iq1evht27d0Ms9sH29Q9+8AN45JFH4Mknn4SFCxfCQw89BDfeeCPs3buXuPF9XHyXbnWmGrULZq5At37zzJ0MuxXO7u4idft2oTDXeRbiOTablLsv0seH99Ew4MeRa9w111xN24O2tBOdNFNjYycNC3xkWMsphRJtTzCmt2mTLd2k7soEfa5TaKv60OEdpC6X19JBZpS6z7a2tJBySunnmhOnMkdrUm+LBgwql5Qd6lAbQ9ut1KGZMm/RFaT85Tv+H1LOe3rLcu+Bk6TOR9uZYeai67CtxeEMmjM+nVseCufNFD3wgW5xj2X101gn6dbviQEt05XY9rePsoTGmBvwwf1U0us9orMb8/Dhjc16TPj2++golfiGBrXbp2JyiYnCXBss5HUsQrO/ppErcJhl/S2M13KkpoRQ+PehQZpd+f0R3VaetTXdQF3HOzraKsdlliHUKWtpx2cujlkm8RWQvOS59J4Wkt+CAfp/NyylhGO0ryIsR0IRrQU+c9mNxVEqAyZPBFlGVbymcZfqInLtNKyJ3VUBABxHrwXHhmjG5HxOzx/uStreQdebWlhIArC4HMDcUMFA41cVBhz/LvcXpefibLmJBJWEiTsrz1DMQ58r3b6xETpHtw+iLLtvv0nqGpv0HG1vp2t1e8dc1laUzoHJ8C1tOqSEwVze+Xx2kZTqMrdcEl6dh3D36XxWSH5Ufi355uMxpY+P559/npSfeOIJaG1tha1bt8L1118PSil49NFH4cEHH4TbbrsNAACeeuopaGtrg6effhq+8Y1vTF/LBUEQBEE4L/lENh8f/o+qsfGD/4n39vZCf38/rF69unJOKBSCG264AbZs2XLaa5RKJchms+SfIAiCIAgXLh/740MpBevWrYPrrrsOliz5wIK/v/+D7ae2tjZybltbW6WOs3HjRkilUpV/OHugIAiCIAgXHh/b1XbNmjXwzjvvwGuvvVZVZ5xGP+M/+5AHHngA1q1bVylns9maHyBjQ9T9L4JcJ0ssNLPh08fDKYubG6ndwj7zYOV4YJhqwEMW1btSca2/LVpC3acOHtK6vEOlOOLOumABdcla0HMRKR/u0zrrrl07aXsGUSrzELVpaGBhpY/t0rYjfYN0V8lArshWmP5eRzcNsTwHDd/sBNWzw6bWQ0tFnlKa6tA8xPBE/Mmf307KDe1UW377XW0Pwd3rykif9JgbpWK6JnYhM5jrmYc1T1ZnVn2263rHpX0wOKRtUnAIbgAAbFaRTqZJHXfzHB5C85Jp+IOD2qahxOxsXBY63yvr98QK0nckGtZzIsRCr1suvWe5iPudTnYcFv2jyCA35RPHaTjxGHLjXnQJdbdubKbh1qNRPS+LBfoOj4zolASOw1xSFV03oih0fipJbRxiIV2OMBsLG61xHnO1dV16DwctDkWTvhM4XDZPPe8xOzYckd+2aGgB5etxL5boHBg6RcO9D6Lw72Nj1BprJJOpHHO7pFCCrqO1MBS2+aB13CXUQHYMhpo47De31cAuqQAAhXH9LP399G/HiRO6PBqlvxdg7xd2yY+F6dyO2vp3ucv58T69Tu0/dJDUFQq/IWXX0/dsbukkdUuXXlI5XjCf/n1saaHvQTKl3cpDERb6AFDbmR2Hy/5egYFctc+Aq+3H+vj41re+Bb/85S/hlVdega4u/Uehvf2DP8r9/f3Q0aENZgYGBqp2Qz4kFApBKDT5mACCIAiCIJzfTEl2UUrBmjVr4LnnnoOXXnoJenqoh0ZPTw+0t7fDpk2bKj8rl8uwefNmuPbaa6enxYIgCIIgnNdMaefjm9/8Jjz99NPwi1/8AhKJRMWOI5VKQSQSAcMwYO3atbBhwwZYsGABLFiwADZs2ADRaBRuv/32j7j65Dh4gG5dzV6wuHIcNunWpl+m28822i4Ls62zRELLF/Ek3apatIhGS3zxhV9XjvOj1JYl2qR3eA4coy5Z3V3aZbfn4qtIXYhtf8+brc/NDFPXt93vabdgX9Et22MjtA+yyP246NEdpmxGy0CtzA3s8BB1O23sTleOh/hOlY9cdpmsomwq0ZR8veVda79r+463SPmdnTtI2QB9Xcti299IirNsvv3PM7zqrU47SL/F8RwJBOjvBVkfmCgaqqXoucmgdrczmUzmWHh8WDRYttscjGoJwskz6QBlUC4z91DDYRlvkWZUZtv4HspUmxuj14myOdqS0s9isyy/WJH4KKfbxhb9zjQwKcXG48Pe2bFx6h4+Pq77IBRich9yJfWZG25nG3UrDyHpyWKRbZWvxyhXpE9WRO7WGSTzAAAMDdPInwUkCy1eTNeXAIpsyze7LZaKFLvTlnJULjmGMmfzyKPlMl0n8jndntEMdc0OoiizvM9/89JLpHz9yithQlBUVZ9lUFUuywaLJBqmlIKB5CXuAmoxF+K3t22tHI+P0D5oQtFhj/bRuiTLYh1E65jPpNNkHEVuZdFzg7a+RyBEJSvLZPL+SKZyfKiXxsbKjOix3PYWW4tYZOZuJJl3dtAwER2dep3vbKN1sTh1XTciuuMNc/rViSl9fDz++OMAALBq1Sry8yeeeAK+/vWvAwDAvffeC4VCAe6++24YGRmBlStXwgsvvDAtMT4EQRAEQTj/mdLHBw+8cjoMw4D169fD+vXrP26bBEEQBEG4gJHcLoIgCIIg1JXzLqvtjgPUjmL2Eh3C3AeqoRncrRPpjFnmTpbJaFezpsYrSN0XPv9pUr7i8kWV439/7mf0nobW/FIpqqHN6tSeQXHmVmm5tO2N7XpoOnqoRj0a0Rrfth07SF3fOHNzDmhX4FQHdYtrnq/ruG2Ex8KQ71VarzzQT32ygshvrsAyqObYELi+7p+bqLxPeHXzJlLOZzP0ngGtpUaiXNLTfWcpOsV5FkwzgG0+6DOHQ1rn5eHDg2GaXdSO6b4NB6n7dcjUGq3N9eswcvVlmT2dEtXli8hlFtswAAD42FWRXcdmbsIkvTKzjUjHdDkVo30Xj1B3xFBA3zNg0DlqsFDotXDQjirvZxuFkfdYqGieCdVGrsHMNALCyI6jkKN9Vxila0EBFbkdkIlCqitmo7P3vd2V48OHDpE6nuFaIVfSzo52UteY0vOnkKe2V7ycQXYCQ8hlGQCggGzePNbWPL8OCu5osvkStfU86DtBXaF5/KZaNh8OskXi7vGGS+cazrrLA3sr0HXcZXd8nI5lsaDvefHCxaTuqiuWV463vvMuqXv9zTdIOTOu12ePuU23dmi32Ouuu47U2Wg+HzpMU3G8/vrvSHnJJTqbejJF15CTqJ9PnqTpJPha0N6mPU17euaSOhw+IDdGbXt4OIGArdf8Ihuv6UB2PgRBEARBqCvy8SEIgiAIQl2Rjw9BEARBEOrKeWfzsW+Uxo0Y9LTerwLU3sAsM00L2RvwsMWdHdoA4X9eS2NwhAPUxqFnzqzK8c1/8mVS9//97L902/rp/ftGtd5WLB4gdUGgmuxwQZcPHGZ5cZD+ploWkaqGNmqL4CMdzzCovu8juwXfoHq+w+I/jKIU9uEAPTdsa+E1Z1At2WHxMZSPtcOJdcS2Fupn31egfviel6kcJ/9vYsMPsdFzZgdpjJSxLLWtcTwc/4HZKdRKI23S5wpE9PxRAdp219CvmcmMPqJBPQaxCB07z5nYZglC9DoGslcJs3gcEWZH0ZjQWm43C8ff1aFDM7PQHVAqUj3dVPp9s5n4nk7q9zRPTRGq2LfvvcrxpZdeQuoiyFaDD4fJomD4KJX4yQFqG5bL6nexVKBxGjxmG4btI+bNn0vqWlp1/3isQQFkn5JmcSJw7BAAGh2fhz7fs3dv5Xg8R+Nq8HNxugKfeSPmkF1bnj1zPk/fgzKyLwoF6Pw5clK/exkUah0AwPM/2gPyQ7C3JLcv4EWc7p5F+Qcf2YPwQCiRKH2H/ueqz6JT6YVsFL9k4RVXk7oly1aQMg73wuddc5O295o3j6bJsNG4z11wGanrnE3ju0Qi+p1JMZsP3HfDw/SFwnYcAACtLdqGKJGg17GQ/Y7JAqh4Pl3/HDQGvjH5cZ4ssvMhCIIgCEJdkY8PQRAEQRDqynknu+zN0O+lX7ymM75eMaeZ1LUHaTjbKNpO7Gin7m0dzXqb9KJ5NIMqsKyXfaf0tte/PvNfpG7rDu1ux7Pskt1dRZ9DMVc8L6Tb47EtfhuFFncNKh+5Jss4i0eYuc8Wy8htkPkm2sz11kJbzKrIwoAjZ7gAzxpr0HLZmVx2ROVQ+SYVo9vWY8il1/Ho1vSixUv0dTqpe/EAy+Y5gLJ5jmeovIbdEbmrovLo9nfM1tubiy6fT+pOIFfOU1kqAxXKuu2FIn1mi23vhlDY+FiAu8jqcW9pSJO6jk461+fP0uHMW0N0/oyjMO3DLCS4xdxOozHtSh5nmY6bmnTdiV7qYshxkJxTHM+QOhO9F1WZhS26fHkobPr+/ftI3diovm6QyQrBEJ3rOKS7z1J9mjhjMZMmm5D8x1198wU6RwuofPToMVKHf5e9PqBYOuV8Wc9DLonkBrXUFGDP7LKQ+y7Kxppj4dVdFAqeZ22t0ktqUEDSj5WlEp6tWMZktOa6LGOyi8aAt8dnUhhWolz2Dhs4zYBPr9M5m+YtAx+5xPt0cE20lvceoWH1C2XdHoONXSJF74HbPjJK22ojuSSWnEvbxtb14VHdzydO0vbgsPYhk66pLCEwGHF9z+IIXe+mA9n5EARBEAShrsjHhyAIgiAIdUU+PgRBEARBqCvnnc3HONOpXtymtd197x8kdTcto257F3VqXb734H5Sd/0KbScQZnr6WJnqkf/+/JuV4227abjhPE4NzewmcGhmnlIahxMGoDYYHtMjS8iuwmGap8HCXJdQCnmeGNBGbp8W82eLRpkeiHRX5tkFHnIl5W5fLnMXDSbSqETdITFDJ6gO7jlUcywgrTl/9Aipa7T0M7eEqd1PoETtKiKmbm/BYmm+FW57ba07X9C2I9evuJTUXbp4aeX4yBFq/zCU0TYgJRZOHdgcsZF7eISlem9G7rTpGH1mj7W9f1D3197BPlJnINfAZCu1l4kkqVtuFLnsNjbTc+PMVbAWETQPy8w2ArtxG8w93mRz1kR2DclknF4HhdGPx6g7psVckaNh/d5y24j9e/ZUjkeHqZ4+ilLae4r2eSBI245DwYeY2G6gsc0XqYvsAHOzzCPXW4v1T0MqXTkus7QH+QK1uXAd3V6/yq4DG6FQ+wKDG6XU4JVXXq4cj7rvkLqYzdzM0XvqMDsO7B7veXR8+BrnIDsgvo5it9NiidZ5zJ7HQDYpAZu5rqe1rWE8nmZtRWs+dyeu6ktdNpl9CO5nk/0NtG1aNtG5fHxw9xhsHTcM9rckiu5ZZPZfdKp9LGTnQxAEQRCEuiIfH4IgCIIg1JXzTnZpam4h5eERvY/UhzI8AgBseXsPKXvOHFSiW1Ut7dq91rDottobb9GMh//1ks5GWPLpdiGgLTm+dUbawrbYFduTw9Ea+VYizjgbsOkQGnw/zNLPabM6C7kqJhJ0m9pibbcU2r5kbsI+kna4JtPRTrffE0lUzk8su7R30Kilx44wGaaEoxxSaad3n44QORqk48NHJIciruZcuoXrE9c8LpPRLdNySW9jb3vtBVK3Kqb7dgnr10JKSxncrZNnZS4it8pRljUWuwwf3kOzXg4WsqRcDOi2R1ppPze0pyvHoSSTJ1hW2yiK4hmKUqnHsCa/tOBow55L5w/OEs37p1Si0gF2tY2w98JEUmohR6N7loapdHokr6Ufn42Bgd7FAJNnsXt6IMwkItYd5bK+7tgIlVaKxXF0TGVC7qgeRvPJKdA1xQHdhgKLcMrL2M3TYH7CLhof5dH5GwxMznUeACCMMlE7FptbPu2gEAo14BvMpRq11WRt5e7Yvq/7uVqCQFKTYll2WU8rtOYaLLwBVnNMoGNgW/r+pRJ9Z7nrLb6l6zL5CMnXXCLn0bpryTeYMssArJhEXsTJry0q93V2zoFPiux8CIIgCIJQV+TjQxAEQRCEuiIfH4IgCIIg1JXzzuaD2y0EUMhpt0g16d6TVOsu5XT2zOuvWkjqIumOyvFokerOm3//FikXkAumw+wEQihUMw/1i8N1cyymaxKTAuaiFUJ6usHFZFY2QlpbxVkTAWjIXofpfWNMF8fZK0tMl081aFezdpQVFQAgHqbtKaBMm7U+fWcvnE3K2Rwdy9wxHCadhY1HroLDrK1B1s9lNJbcPbJW6GhDTVy3/503SPnomNaBW0yqdWN7Ho/ps+MmbXu/0jr9AeYyfAxl5M1H6TMmZneScluP1mvDaZp9lcwfpi3H49QuKIpcb80AtZNSU3DBzGb0WObHMqRu4IR+p4tFqpl7LAux45TRMXNdR/PXZBl4AyxrNXVBZy6yyGWXh1B3kNtnIUe1/1KJvk9jKAS2ok2FWFKvIdz2Sjl0TpTG9TxwXXrPUWRjwG08uNsptnHw1cTZnG2b2rkYvjvBmdXgrNHjOZpmIGrx+YPayhYKnMm3zNIwuC4LA27qcxWz68DzxXdZ+HnmausheyNuO4KzCXMTC6X0M5eY23RVaHic9ZfZACriLu+xOuYWjP54cIscfA+rzPuDjmW+Qb/fHd3Uzb4TxOZDEARBEITzDPn4EARBEAShrsjHhyAIgiAIdeW8s/ngvv44Nb1v0XDmZaB67clxrb9t20t9+7+Q11rYmKL+z8dHaDmMtG83T+9RRDprNMpsLAL2ac8DOE3oaAOH86XDpJAur9j3Y4ClBx9HYZPLLtWdsQ0IjyXC7TpyRa2PxtPUrqOhRadsLzPdec8eGmslgLTmZTVkw2QDjT/R0tZKyn3I5qNK10THJWbH4TBTDRx63JtCevCqM1EjHKav5wZ1aGIzlCZ1FgqPfYJpuTuAzpEDtn6yXJxq77FuncK+pXMWqWtqaSPlEAovXmZPopDeH7JZXBheRvYQFo+rMYX4y/2HdIoExeyksC7O40/YIWZ/YOFYDPTcILJJibLYL/xcbKvlsjgf4+NaJy+XaJ2PDBVMFqra9+h7EQzpuChts6hNzvi4TmmfHaG2EW6ZxQdC7eOxKfJlbA/CbGC4zRKOoM6uE0D9bgG3Y6NrYy2OHtXxkvb30eeIsRDzNrbFqnrD9bi7HhsDn9oxBEPmhHXYdoRFaa8KI49jaxgGi/mD5yWfo8g+j9sA8nQKvjdxrBUT2aoZBp33PFUHfodrDDM4QPvOa6TvxaylOj1JiobxqWUON2lk50MQBEEQhLoypY+Pxx9/HC677DJIJpOQTCbhmmuugf/+7/+u1CulYP369dDZ2QmRSARWrVoFu3btmvZGC4IgCIJw/jIl2aWrqwsefvhhmD9/PgAAPPXUU/BHf/RHsH37drj00kvhBz/4ATzyyCPw5JNPwsKFC+Ghhx6CG2+8Efbu3QuJROIjrj5JeGpAtMVkWWw7StGtX8/U9b0DdLvwX//915Xjz6xaTup6T9CMfjmcqZDLHigrqMW2EqNo6y4YofJIYYxKItjtSTEJJIDcV/lWOHeXwlvjfHuugMNIszruYphGMkhTWwepOzWks3tmBvtJXeYwzR48f14PTIYIy0YbYplHA0Hdlx5zP8RP4hp8f5C5EaoJjj+CKmdEtE07zvpyD9r+TgWpFLenqEOh72Ky2BALb97Urfuuo4dKK2kUjj4Uoy6xpk+3cB38zrCMmBaSJ+yqbKv0OkQSMfg28eT/X2P5WqbyWXh+HN686v7MrdxUeGua3qOEwtG7Du1nLJcAVLtAYrB7eiBI56SF3FBtnhKBvcPhkL5OKEKvMzyk25obo+tUgMmzFurnMpNyXbz9XsMdE4CG4eZu5GG0xoxnM6QunxuFyWIqFH6eywEeXbuxLFSVOddC4dXVxOsdAA1hwD3p8XxRLGQ6n0CKxlAnYDmFh4JwUdsd1laf/b1SKJsxl0twlnP+IEbV2Op7Kps21kWZ1ZOd7aSuaykNP2Ebel5m9u2kDeqiUu7HYUo7H7fccgt84QtfgIULF8LChQvh+9//PsTjcXj99ddBKQWPPvooPPjgg3DbbbfBkiVL4KmnnoJ8Pg9PP/30J26oIAiCIAgXBh/b5sPzPHjmmWcgl8vBNddcA729vdDf3w+rV6+unBMKheCGG26ALVu2THidUqkE2WyW/BMEQRAE4cJlyh8fO3fuhHg8DqFQCO666y742c9+Bpdccgn093+w3d7WRrdj2traKnWnY+PGjZBKpSr/uru7p9okQRAEQRDOI6bsanvxxRfDjh07IJPJwLPPPgt33nknbN68uVLPtUSlVNXPMA888ACsW7euUs5mszU/QJrSaVIuFrUmmmMppYMW1dddpLvycNCb33inctx7grrhZnLUD2t4XGvUzLMUYkhvd5lrVSg0sZ4ejlAdz0Larh2g5+Jwwy6zLzCq3K6QK6lDn6OMwgtHwtQGpbmpiZQbm7WdR1nRb9ZSUE+jQoi21Wdpx3MsxPBEOMyFLleg2ncirdtbzLGw26jfPaYXe9yuA/3AmFjqr0IxOwGFXOpyJm37q2Wtix/O07qhqG6f3UbnfUdXCyn3tOhyU4qOj4nmXY5pwEVm92IjDT/MbGnCUW1rYwfpnAhHqA1KCM0Znl5+KvjIz5G7gCqkkytmu6KY3zSxQWH3wOnLPW4XwN4v/J5a3AUe/S6fStguwHNomG+PuV+XA7rvCgVqg4LtPHzmImsEmWs/StlQ1Xdo6vO2Vq3T6NjmId3L+v0aGTpJ6pzy5N5nAAAXhVf32O+VWSoBEireZ7Y9qOgz+weT9UEZjYnPbS6QfZHv02cOsr8PeBnh18G2SNw8xcchzJk9E7etIfYibHwMZOcC3J2Y3dRBfwOcGJ3bjRdfVDmeNZeuN8WTdGzf36PTikSccVIHXfCJmfLHRzAYrBicLl++HN588034h3/4B7jvvvsAAKC/vx86OvQfqoGBgardEEwoFCIvuyAIgiAIFzafOM6HUgpKpRL09PRAe3s7bNq0qVJXLpdh8+bNcO21137S2wiCIAiCcIEwpZ2P73znO3DTTTdBd3c3jI2NwTPPPAO//e1v4fnnnwfDMGDt2rWwYcMGWLBgASxYsAA2bNgA0WgUbr/99jPVfkEQBEEQzjOm9PFx8uRJ+NrXvgZ9fX2QSqXgsssug+effx5uvPFGAAC49957oVAowN133w0jIyOwcuVKeOGFF6YvxgcAFJnNAIqeCyUWIzdgUb3LRZKaYrqmGdGa+SEW18NksTRcpDW7zH+/WNRab46lpce+9FxqigWpZh5BcUBMpofimBeRKI3pUC5TPfLUsI7B4bNwujby+W5I0rga7Y1pWm7XcSQyzMYim9EhoMdHM6Qu3UjDpA+eGkQlGqYd43j0HlaQ6qMNLbq9TpyNM4r7wUKAgMPscBSy+WDdTMJMV2nk3I4Jx3iwWVyNiG5fKUX746K0liQbGml6+3iSvp7xqJ6HoTCtK6K0A2WecpvZY1gozH9VQAxUDjC7JB5TJoCuw+Mr8LgStSiikOE2TyWA2lMVwp2ldzeR3Y3J3m9su1EV+p2VsX0ID/eOw5R7LJ28g8bAYuuUM05tljzUnliJ2u9gOw+TjU+pwFLG87hHpGriOh5u3UZzhI/l8MmByrFTomtaDXO+atBlrQCLM8Le7wBam8BjG/TImMViKTR4cxQy5DKYnVYY2c80JOl7aQKP/TLxuFsorH+I2by5LrIpY9fk4dY9ZJ8ylqXzBZu2+Gzejxr0OnazfpY5C2nsjoYGveYe33OA1A0eOEivg54zHJjKQE+OKX18/PjHP65ZbxgGrF+/HtavX/9J2iQIgiAIwgWM5HYRBEEQBKGunHdZbfm2YwhteUXZ0/gO3frEEXR9FiDbR6GIfbaV55aZC5un71ntGqjLfFsNbwWPDNNslcOsrcmElhVSLMNrEoVpDwN1h/R8KlfYaNvRCtHnKhX1uWEmFdjM79TNj6Jjeo/xzFDl2Heo73GYZR4tTjLbKd+WTTdReSkeQ66TJToGWHZxPR56nYeVRiG52bc43vI2ucslC1tso23jKJMnEmgs2+JpUhcPaXfwGAu9HmR9V0bF8SC9fwFvCzPXuzDbpg1aOEQ43SbGkoTBXS65GyNyIwwGmftfYPJZbXEmZt7PAdQGLqUo9px4ZKuj6uPQ1XTbHLyJXbV5Fm0XuauXWYbZApJavEKe1LnM1TaGrhtJUfnRRf3qFOk9uAyDqQppgF3OebhuJovF0JqSy9K1KYtDqrPrmObk/4RYWPcus/WXZXBWoPvAAjp/bVSuzkjM3GDRRODZaH1X3yNv0+CWPMs4ICkTZ40FAPBR5vCiw2UgnA2Xh3Bnt0DN84Cl2UVt567iyVaWAXyhTsNgsr9ze9/8vW7rwCCps9hct9GcqCXhfVxk50MQBEEQhLoiHx+CIAiCINQV+fgQBEEQBKGuGIoLuWeZbDYLqVQK7r//fol8KgiCIAjnCaVSCR5++GEYHR2FZDJZ81zZ+RAEQRAEoa7Ix4cgCIIgCHVFPj4EQRAEQagr8vEhCIIgCEJdkY8PQRAEQRDqyjkX4fRD55tSqfQRZwqCIAiCcK7w4d/tyTjRnnOutseOHYPu7u6z3QxBEARBED4GR48eha6urprnnHMfH77vw4kTJ0ApBbNnz4ajR49+pL/wTCSbzUJ3d7f0zwRI/9RG+qc20j+1kf6pzUztH6UUjI2NQWdnZ1UuJs45J7uYpgldXV2QzX6Q6CeZTM6owZsq0j+1kf6pjfRPbaR/aiP9U5uZ2D+pVGpS54nBqSAIgiAIdUU+PgRBEARBqCvn7MdHKBSC7373u5LfZQKkf2oj/VMb6Z/aSP/URvqnNtI/H805Z3AqCIIgCMKFzTm78yEIgiAIwoWJfHwIgiAIglBX5ONDEARBEIS6Ih8fgiAIgiDUFfn4EARBEAShrpyzHx+PPfYY9PT0QDgchmXLlsGrr756tptUdzZu3AgrVqyARCIBra2tcOutt8LevXvJOUopWL9+PXR2dkIkEoFVq1bBrl27zlKLzy4bN24EwzBg7dq1lZ/N9P45fvw4fPWrX4WmpiaIRqNwxRVXwNatWyv1M7l/XNeFv/3bv4Wenh6IRCIwb948+N73vge+71fOmUn988orr8Att9wCnZ2dYBgG/PznPyf1k+mLUqkE3/rWt6C5uRlisRh88YtfhGPHjtXxKc4ctfrHcRy47777YOnSpRCLxaCzsxPuuOMOOHHiBLnGhdw/U0adgzzzzDMqEAioH/3oR2r37t3qnnvuUbFYTB0+fPhsN62u/MEf/IF64okn1Lvvvqt27Nihbr75ZjV79mw1Pj5eOefhhx9WiURCPfvss2rnzp3qS1/6kuro6FDZbPYstrz+vPHGG2ru3LnqsssuU/fcc0/l5zO5f4aHh9WcOXPU17/+dfX73/9e9fb2qhdffFEdOHCgcs5M7p+HHnpINTU1qV/96leqt7dX/cd//IeKx+Pq0UcfrZwzk/rn17/+tXrwwQfVs88+qwBA/exnPyP1k+mLu+66S82aNUtt2rRJbdu2TX36059Wl19+uXJdt85PM/3U6p9MJqM+97nPqZ/+9Kdqz5496ne/+51auXKlWrZsGbnGhdw/U+Wc/Pi4+uqr1V133UV+tmjRInX//fefpRadGwwMDCgAUJs3b1ZKKeX7vmpvb1cPP/xw5ZxisahSqZT653/+57PVzLozNjamFixYoDZt2qRuuOGGysfHTO+f++67T1133XUT1s/0/rn55pvVX/7lX5Kf3XbbbeqrX/2qUmpm9w//4zqZvshkMioQCKhnnnmmcs7x48eVaZrq+eefr1vb68HpPs44b7zxhgKAyn+aZ1L/TIZzTnYpl8uwdetWWL16Nfn56tWrYcuWLWepVecGo6OjAADQ2NgIAAC9vb3Q399P+ioUCsENN9wwo/rqm9/8Jtx8883wuc99jvx8pvfPL3/5S1i+fDn86Z/+KbS2tsKVV14JP/rRjyr1M71/rrvuOvjNb34D+/btAwCAt99+G1577TX4whe+AADSP5jJ9MXWrVvBcRxyTmdnJyxZsmTG9RfAB+u1YRiQTqcBQPqHc85ltR0cHATP86CtrY38vK2tDfr7+89Sq84+SilYt24dXHfddbBkyRIAgEp/nK6vDh8+XPc2ng2eeeYZ2LZtG7z55ptVdTO9fw4ePAiPP/44rFu3Dr7zne/AG2+8AX/9138NoVAI7rjjjhnfP/fddx+Mjo7CokWLwLIs8DwPvv/978NXvvIVAJD5g5lMX/T390MwGISGhoaqc2ba2l0sFuH++++H22+/vZLVVvqHcs59fHyIYRikrJSq+tlMYs2aNfDOO+/Aa6+9VlU3U/vq6NGjcM8998ALL7wA4XB4wvNmav/4vg/Lly+HDRs2AADAlVdeCbt27YLHH38c7rjjjsp5M7V/fvrTn8JPfvITePrpp+HSSy+FHTt2wNq1a6GzsxPuvPPOynkztX9Ox8fpi5nWX47jwJe//GXwfR8ee+yxjzx/pvXPh5xzsktzczNYllX1JTgwMFD11T1T+Na3vgW//OUv4eWXX4aurq7Kz9vb2wEAZmxfbd26FQYGBmDZsmVg2zbYtg2bN2+Gf/zHfwTbtit9MFP7p6OjAy655BLys8WLF8ORI0cAQObP3/zN38D9998PX/7yl2Hp0qXwta99Db797W/Dxo0bAUD6BzOZvmhvb4dyuQwjIyMTnnOh4zgO/Nmf/Rn09vbCpk2bKrseANI/nHPu4yMYDMKyZctg06ZN5OebNm2Ca6+99iy16uyglII1a9bAc889By+99BL09PSQ+p6eHmhvbyd9VS6XYfPmzTOirz772c/Czp07YceOHZV/y5cvhz//8z+HHTt2wLx582Z0/3zqU5+qcs3et28fzJkzBwBk/uTzeTBNugRallVxtZ3p/YOZTF8sW7YMAoEAOaevrw/efffdGdFfH3547N+/H1588UVoamoi9TO9f6o4W5autfjQ1fbHP/6x2r17t1q7dq2KxWLq0KFDZ7tpdeWv/uqvVCqVUr/97W9VX19f5V8+n6+c8/DDD6tUKqWee+45tXPnTvWVr3zlgnUFnAzY20Wpmd0/b7zxhrJtW33/+99X+/fvV//2b/+motGo+slPflI5Zyb3z5133qlmzZpVcbV97rnnVHNzs7r33nsr58yk/hkbG1Pbt29X27dvVwCgHnnkEbV9+/aKt8Zk+uKuu+5SXV1d6sUXX1Tbtm1Tn/nMZy4YV9Ja/eM4jvriF7+ourq61I4dO8h6XSqVKte4kPtnqpyTHx9KKfVP//RPas6cOSoYDKqrrrqq4l46kwCA0/574oknKuf4vq+++93vqvb2dhUKhdT111+vdu7cefYafZbhHx8zvX/+8z//Uy1ZskSFQiG1aNEi9cMf/pDUz+T+yWaz6p577lGzZ89W4XBYzZs3Tz344IPkj8VM6p+XX375tOvNnXfeqZSaXF8UCgW1Zs0a1djYqCKRiPrDP/xDdeTIkbPwNNNPrf7p7e2dcL1++eWXK9e4kPtnqhhKKVW/fRZBEARBEGY655zNhyAIgiAIFzby8SEIgiAIQl2Rjw9BEARBEOqKfHwIgiAIglBX5ONDEARBEIS6Ih8fgiAIgiDUFfn4EARBEAShrsjHhyAIgiAIdUU+PgRBEARBqCvy8SEIgiAIQl2Rjw9BEARBEOrK/w988m9fAJGeEQAAAABJRU5ErkJggg==\n"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GroundTruth:  cat   ship  ship  plane\n"
     ]
    }
   ],
   "source": [
    "dataiter = iter(test_loader)\n",
    "images, labels = next(dataiter)\n",
    "\n",
    "# print images\n",
    "imshow(torchvision.utils.make_grid(images))\n",
    "print('GroundTruth: ', ' '.join(f'{classes[labels[j]]:5s}' for j in range(4)))"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "#### 加载模型\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "outputs": [
    {
     "data": {
      "text/plain": "Net(\n  (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\n  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\n  (fc1): Linear(in_features=400, out_features=120, bias=True)\n  (fc2): Linear(in_features=120, out_features=84, bias=True)\n  (fc3): Linear(in_features=84, out_features=10, bias=True)\n)"
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "net = Net()\n",
    "net.load_state_dict(torch.load(path))\n",
    "net"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Predicted:  bird  dog   ship  frog \n"
     ]
    }
   ],
   "source": [
    "output = net(images)\n",
    "_, predicted = torch.max(outputs, 1)\n",
    "print('Predicted: ', ' '.join(f'{classes[predicted[j]]:5s}'\n",
    "                              for j in range(4)))"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy of the network on the 10000 test images: 55 %\n"
     ]
    }
   ],
   "source": [
    "correct = 0\n",
    "total = 0\n",
    "# since we're not training, we don't need to calculate the gradients for our outputs\n",
    "with torch.no_grad():\n",
    "    for data in test_loader:\n",
    "        images, labels = data\n",
    "        # calculate outputs by running images through the network\n",
    "        outputs = net(images)\n",
    "        # the class with the highest energy is what we choose as prediction\n",
    "        _, predicted = torch.max(outputs.data, 1)\n",
    "        total += labels.size(0)\n",
    "        correct += (predicted == labels).sum().item()\n",
    "\n",
    "print(f'Accuracy of the network on the 10000 test images: {100 * correct // total} %')"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy for class: plane is 56.6 %\n",
      "Accuracy for class: car   is 53.8 %\n",
      "Accuracy for class: bird  is 41.0 %\n",
      "Accuracy for class: cat   is 32.5 %\n",
      "Accuracy for class: deer  is 40.5 %\n",
      "Accuracy for class: dog   is 41.2 %\n",
      "Accuracy for class: frog  is 75.3 %\n",
      "Accuracy for class: horse is 67.1 %\n",
      "Accuracy for class: ship  is 74.4 %\n",
      "Accuracy for class: truck is 69.0 %\n"
     ]
    }
   ],
   "source": [
    "# prepare to count predictions for each class\n",
    "correct_pred = {classname: 0 for classname in classes}\n",
    "total_pred = {classname: 0 for classname in classes}\n",
    "\n",
    "# again no gradients needed\n",
    "with torch.no_grad():\n",
    "    for data in test_loader:\n",
    "        images, labels = data\n",
    "        outputs = net(images)\n",
    "        _, predictions = torch.max(outputs, 1)\n",
    "        # collect the correct predictions for each class\n",
    "        for label, prediction in zip(labels, predictions):\n",
    "            if label == prediction:\n",
    "                correct_pred[classes[label]] += 1\n",
    "            total_pred[classes[label]] += 1\n",
    "\n",
    "\n",
    "# print accuracy for each class\n",
    "for classname, correct_count in correct_pred.items():\n",
    "    accuracy = 100 * float(correct_count) / total_pred[classname]\n",
    "    print(f'Accuracy for class: {classname:5s} is {accuracy:.1f} %')"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
